package doing.doing_501_1000;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.*;

/**
 * 914. X of a Kind in a Deck of Cards
 * 给定一副牌，每张牌上都写着一个整数。
 * <p>
 * 此时，你需要选定一个数字 X，使我们可以将整副牌按下述规则分成 1 组或更多组：
 * 每组都有 X 张牌。
 * 组内所有的牌上都写着相同的整数。
 * 仅当你可选的 X >= 2 时返回 true。
 * <p>
 * 示例 1：
 * 输入：[1, 2, 3, 4, 4, 3, 2, 1]
 * 输出：true
 * 解释：可行的分组是 [1, 1], [2, 2], [3, 3], [4, 4]
 *
 * @author wangxiaozhe
 */
@Slf4j
public class XOfAKindInADeckOfCards {

    @SuppressWarnings("all")
    public boolean hasGroupsSizeX(int[] deck) {
        Map<Integer, Integer> times = new HashMap<>();

        for (int val : deck) {
            times.put(val, times.getOrDefault(val, 0) + 1);
        }

        int val = -1;
        boolean isFrist = true;

        for (Integer key : times.keySet()) {
            if (isFrist) {
                val = times.get(key);
                isFrist = false;
            } else {
                val = swap(val, times.get(key));
            }
            if (val <= 1) {
                return false;
            }
        }
        return true;
    }

    private int swap(int a, int b) {
        if (a < b) {
            int temp = a;
            a = b;
            b = temp;
        }
        return (a % b == 0) ? b : swap(b, a % b);
    }

    @Test
    public void test() {
        int[] deck = new int[]{1, 2, 3, 4, 4, 3, 2, 1};
        log.info("result:{}", hasGroupsSizeX(deck));
    }
}







































/*
public boolean hasGroupsSizeX(int[] deck) {
    Map<Integer,Integer> times = new HashMap<>();
    for(int val : deck){
        times.put(val, times.getOrDefault(val, 0)+1);
    }
    int val = -1;
    boolean isFrist = true;
    for(Integer key : times.keySet()){
        if(isFrist){
            val = times.get(key);
            isFrist = false;
        }else{
            val = GetGCD(val, times.get(key));
        }
        if(val <= 1){
            return false;
        }
    }
    return true;
}

private int GetGCD(int a, int b){
    if(a < b){
        int temp = a;
        a = b;
        b = temp;
    }
    return (a%b == 0) ?b : GetGCD(b, a%b);

}
*/
